//定义：迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素 而又不需要暴露该对象的内部表示。
//核心：在使用迭代器模式之后 即使不关心对象的内部构造，也可以按顺序访问其中的每个元素
//实现：js数组的map foreach 已经内置了迭代器 不过对于对象的遍历 不能使用与数组同样的遍历代码
// let forEac=function(arr,fn){
//     for(let i=0;i<arr.length;i++){
//         fn.call(arr[i],arr[i],i,arr)
//         // fn(arr[i],i,arr)
//     }
// }
// let a =[1,2,3]
// forEac(a,function(item,i,arr){
//     console.log(item,i,arr)
// })

//封装通用数组对象的遍历代码
function each(obj,cb){
    var value;
    if(Array.isArray(obj)){
        for(let i=0;i<obj.length;i++){
            // cb(i,obj[i])
            value = cb.call(obj[i],i,obj[i]);
           
            if(value === false){
               
                break;
            }
        }
    }else{
        for(let i in obj){
            value = cb.call(obj[i],i,obj[i])

            if(value ===false){
                break
            }
        }
    }
}
each([1, 2, 3], function(index, value) {
    console.log(index, value);
});

each({a: 1, b: 2}, function(index, value) {
    console.log(index, value);
});


function year2000() {
    var year = new Date().getFullYear();

    if (year <= 2000) {
        console.log('A');
    }

    return false;
}

function year2100() {
    var year = new Date().getFullYear();

    if (year >= 2100) {
        console.log('C');
    }

    return false;
}

function year() {
    var year = new Date().getFullYear();

    if (year > 2000 && year < 2100) {
        console.log('B');
    }

    return false;
}

function iteratorYear() {
    for (var i = 0; i < arguments.length; ++i) {
        var ret = arguments[i]();

        if (ret !== false) {
            return ret;
        }
    }
}

var manager = iteratorYear(year2000, year2100, year); // B